#include <iostream>

#include "menu.h"
///menu.cpp is class implementation for menu.h
#include <sstream>

Menu::Menu(std::vector<Document> *p_menu_v_ptr):menu_v_ptr(p_menu_v_ptr)
{
	Menu_options_enum m=INVALID_CHOICE;
	do
	{
		write_main_menu();
		std::cout<<"Valasszon: ";
		m=get_menu_choice();
		do_chosen_menu(m);
	}while(EXIT_AND_SAVE!=m);
}

Menu::~Menu()
{
}

void Menu::write_main_menu() const
{
	std::cout<<std::endl<<
	"Menu:"<<std::endl<<
	"Uj irat:"<<std::endl<<
	"   [ h ]atarozat"<<std::endl<<
	"   Ugyfeltol erkezo level:"<<std::endl<<
	"      [ a ]janlatkeres"<<std::endl<<
	"      [ p ]anaszos level"<<std::endl<<
	"   [ s ]zamla"<<std::endl<<
	"Lekerdezesek:"<<std::endl<<
	"   Pa[ r ]tnerre"<<std::endl<<
	"   [ u ]gyszamra"<<std::endl<<
	"   [ i ]ktatoszamra"<<std::endl<<
	"[ k ]ilepes es mentes"<<std::endl;
}

void Menu::add_document(const Document::Document_types &p_type)
{
	std::cout<<"Irat hozzadasa: "<<Document::document_type_name(p_type)<<std::endl;
	Document d(p_type);
	std::cin>>d;
	menu_v_ptr->push_back(d);
}

void Menu::query_partner() const
{
	std::cout<<"Kereses partner alapjan."<<std::endl;
	std::cout<<"Partner    ? ";
	std::string p_partner;
	getline(std::cin,p_partner);
	bool found=false;
	int total=0;
	for(unsigned int i=0;i<menu_v_ptr->size();++i)
	{
		if(std::string::npos!=menu_v_ptr->at(i).get_partner().find(p_partner))
		{
			std::cerr<<menu_v_ptr->at(i)<<std::endl;
			if(1==menu_v_ptr->at(i).get_type())
			{
				total+=menu_v_ptr->at(i).get_total();
			}
			if(!found)
			{
				found=true;
			}
		}
	}
	if(!found)
	{
		std::cout<<"Nincsen talalat."<<std::endl;
	}
	std::cout<<"A fenti listaban szereplo szamlak osszerteke: "<<total<<" Ft."<<std::endl;
}

void Menu::query_issue_no() const
{
	std::cout<<"Kereses ugyszam alapjan."<<std::endl;
	std::cout<<"Ugyszam    ? ";
	std::string p_string;
	getline(std::cin,p_string);
	std::istringstream* p_s;
	p_s=new std::istringstream(p_string);
	int p_issue_no;
	(*p_s)>>std::noskipws>>p_issue_no;
	delete p_s;
	bool found=false;
	for(unsigned int i=0;i<menu_v_ptr->size();++i)
	{
		if(p_issue_no==menu_v_ptr->at(i).get_issue_no())
		{
			std::cerr<<menu_v_ptr->at(i)<<std::endl;
			if(!found)
			{
				found=true;
			}
		}
	}
	if(!found)
	{
		std::cout<<"Nincsen talalat."<<std::endl;
	}
}

void Menu::query_ref_no() const
{
	std::cout<<"Kereses iktatoszam alapjan."<<std::endl;
	std::cout<<"Iktatoszam ? ";
	std::string p_string;
	getline(std::cin,p_string);
	std::istringstream* p_s;
	p_s=new std::istringstream(p_string);
	int p_ref_no;
	(*p_s)>>std::noskipws>>p_ref_no;
	delete p_s;
	bool found=false;
	for(unsigned int i=0;i<menu_v_ptr->size();++i)
	{
		if(p_ref_no==menu_v_ptr->at(i).get_ref_no())
		{
			std::cerr<<menu_v_ptr->at(i)<<std::endl;
			if(!found)
			{
				found=true;
			}
		}
	}
	if(!found)
	{
		std::cout<<"Nincsen talalat."<<std::endl;
	}
}

Menu::Menu_options_enum Menu::get_menu_choice() const
{
	bool p_ok=true;
  char p_ch;
	Menu_options_enum p_m=INVALID_CHOICE;
	do
	{
		std::string p_s;
		getline(std::cin,p_s);
		//if(1==p_s.length())
		{
			p_ch=p_s[0];
			//std::cerr<<p_ch;
			switch(p_ch)
			{
				case 'h':
				{
					///hatarozat
					p_m=ADD_ORDER;
					break;
				}
				case 'a':
				{
					///ajanlatkeres
					p_m=ADD_TENDER;
					break;
				}
				case 'p':
				{
					///panaszos level
					p_m=ADD_CLAIM;
					break;
				}
				case 's':
				{
					///szamla
					p_m=ADD_BILL;
					break;
				}
				case 'r':
				{
					///kereses partnerre
					p_m=QUERY_PARTNER;
					break;
				}
				case 'u':
				{
					///kereses ugyszamra
					p_m=QUERY_ISSUE;
					break;
				}
				case 'i':
				{
					///kereses iktatoszamra
					p_m=QUERY_REF_NO;
					break;
				}
				case 'k':
				{
					///kilepes es mentes
					p_m=EXIT_AND_SAVE;
					break;
				}
				default:
				{
					break;
				}
			}
		}
		if(INVALID_CHOICE==p_m)
		{
			std::cerr<<"Ervenytelen valasztas."<<std::endl;
			std::cout<<"Valasszon: ";
			p_ok=false;
		}
		else
		{
			p_ok=true;
		}
	}while(!p_ok);
	return(p_m);
}

void Menu::do_chosen_menu(const Menu_options_enum &p_menu)
{
	switch(p_menu)
	{
		case ADD_ORDER:
		{
			add_document(Document::ORDER);
			break;
		}
		case ADD_TENDER:
		{
			add_document(Document::TENDER);
			break;
		}
		case ADD_CLAIM:
		{
			add_document(Document::CLAIM);
			break;
		}
		case ADD_BILL:
		{
			add_document(Document::BILL);
			break;
		}
		case QUERY_PARTNER:
		{
			query_partner();
			break;
		}
		case QUERY_ISSUE:
		{
			query_issue_no();
			break;
		}
		case QUERY_REF_NO:
		{
			query_ref_no();
			break;
		}
		case EXIT_AND_SAVE:
		{
			break;
		}
		default:
		{
			throw UNKNOWN_MENU_CHOICE;
			break;
		}
	}
}
